﻿@model Documentation.Models.DocModel2

@{
    Layout = null;
}

<!DOCTYPE html>

<script type="text/javascript" src="~/Scripts/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="~/Scripts/syntaxhighlighter/shBrushCSharp.js"></script>

<link href="~/Content/syntaxhighlighter/shCore.css" rel="stylesheet" type="text/css" />
<link href="~/Content/syntaxhighlighter/shThemeDefault.css" rel="stylesheet" type="text/css" />

<html>
    <head>
        @{
            var title = "Remote Facade";
        }
        <title>@title</title>
        <link rel="stylesheet" href="~/Content/Site.css" type="text/css" />
    </head>
    <body>
        <h1>@title</h1>
        <p>
            Интерфейс <code>IRemoteFacade</code> определяется в общей сборке между сервером и клиентом:
        </p>
        <script type="syntaxhighlighter" class="brush: csharp">
        <![CDATA[
public interface IRemoteFacade
{
    My1 Test0(My2 x1, decimal x2, DateTime x3);
    void Test1();
}

public class My1
{
    public string A1 { get; set; }
}

public class My2
{
    public string A2 { get; set; }
}
        ]]>
    </script>
        <p>
            На сервере реализация интерфейса:
        </p>
        <script type="syntaxhighlighter" class="brush: csharp">
        <![CDATA[
public class RemoteFacadeImpl : IRemoteFacade
{
    public My1 Test0(My2 x1, decimal x2, DateTime x3)
    {
        throw new NotImplementedException();
    }

    public void Test1()
    {
        throw new NotImplementedException();
    }
}
        ]]>
    </script>
        <p>
            Асинхронный вызов метода <code>IRemoteFacade.Test0</code> на клиенте:
        </p>
        <script type="syntaxhighlighter" class="brush: csharp">
        <![CDATA[
Caller.Call(
    facade => facade.Test0(new My2 {A2 = "Test"}, 34.6m, DateTime.Now),
    result => {
        if (result.Error == null)
            Console.WriteLine(result.Value);
        else
            throw new NotImplementedException();
    });
        ]]>
    </script>
        <p>
            Использовать <code>await/async</code> вместо колбека пока нельзя, поскольку
            на клиентских машинах .NET 4.0. Для <code>await/async</code> нужен .NET 4.5.
            Думаю, это легко дописывается для <code>await/async</code>.
        </p>
        <p>
            Получилось даже проще, чем при использовании WCF.
            Добавление метода к <code>RemoteFacade</code> крайне простая операция:
            просто добавляешь метод, добавляешь реализация,
            добавляешь свои классы для аргументов и результата.
            Не надо ни атрибутов навешивать, ни перегенерировать клиентов.
            Навигация классная, из клиента сразу на серверную реализацию
            преходишь по
            <a href="http://www.jetbrains.com/resharper/webhelp/Navigation_and_Search__Go_to_Implementation.html"
               >Go to Implementation</a>.
        </p>
        <script type="text/javascript">
            SyntaxHighlighter.all()
        </script>
    </body>
</html>